home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / MorphOS / tictactoe-1.2.1 / moves.c < prev    next >
C/C++ Source or Header  |  2002-10-22  |  2KB  |  109 lines

  1. #include <stdio.h>
  2. #include "messages.h"
  3. #include "t3types.h"
  4. #include "t3visual.h"
  5. #include "line_o_s.h"
  6. #include "scores.h"
  7.  
  8. int end_of_game() {
  9.     int x, y;
  10.     int rsum, csum, drsum, dlsum;
  11.  
  12.     /* Check rows and cols*/
  13.     for(y=0; y<SIZE; y++) {
  14.         for(x=rsum=csum=0; x<SIZE; x++) {
  15.             rsum+=board[y][x];
  16.             csum+=board[x][y];
  17.         }
  18.         if(rsum==SIZE*ME || csum==SIZE*ME)
  19.             return ME;
  20.         if(rsum==SIZE*YOU || csum==SIZE*YOU)
  21.             return YOU;
  22.     }
  23.         
  24.     /* Check diags */
  25.     for(x=drsum=dlsum=0; x<SIZE; x++) {
  26.         drsum+=board[x][x];
  27.         dlsum+=board[x][SIZE-1-x];
  28.     }
  29.     if(drsum==SIZE*ME || dlsum==SIZE*ME)
  30.         return ME;
  31.     if(drsum==SIZE*YOU || dlsum==SIZE*YOU)
  32.         return YOU;
  33.  
  34.     /* Check if no more moves */
  35.     for(y=0; y<SIZE; y++)
  36.         for(x=0; x<SIZE; x++)
  37.             if(!board[y][x])
  38.                 return 0;
  39.     return DRAW;
  40. }
  41.  
  42. int is_valid_move(int row, int col) {
  43.     if(row<0 || row>=SIZE)
  44.         return 1;
  45.     if(col<0 || col>=SIZE)
  46.         return -1;
  47.     if(board[row][col])
  48.         return -3;
  49.     return 0;
  50. }
  51.  
  52. int get_your_move() {
  53.     int x, y;
  54.     int invalid=1;
  55.  
  56.     while(invalid) {
  57.         print_msg("Place your piece\n");
  58.         print_msg("row = (1-%d) ", SIZE);
  59.         fflush(stdin);
  60.         scanf("%u", &y);
  61.         print_msg("col = (1-%d) ", SIZE);
  62.         fflush(stdin);
  63.         scanf("%u", &x);
  64.  
  65.         y--; x--;
  66.  
  67.         invalid=is_valid_move(y,x);
  68.         switch (invalid) {
  69.             case -3:
  70.                 print_error("slot_not_empty");
  71.                 break;
  72.             case 1:
  73.                 print_error("y_out_of_bounds");
  74.                 break;
  75.             case -1:
  76.                 print_error("x_out_of_bounds");
  77.                 break;
  78.         }
  79.     }
  80.  
  81.     return y*SIZE+x;
  82. }
  83.  
  84. int get_my_move() {
  85.     int position;
  86.  
  87.     print_msg("My move\n");
  88.  
  89.     /* Check if ME can win */
  90.     print_debug("Can I win?");
  91.     position=get_winning_position(ME);
  92.     if(position >= 0)
  93.         return position;
  94.  
  95.     /* Check if YOU can win */
  96.     print_debug("Can you win?");
  97.     position=get_winning_position(YOU);
  98.     if(position >= 0)
  99.         return position;
  100.  
  101.     print_debug("So what's my best move then?");
  102.     position=set_scores(ME);
  103.     if(debug)
  104.         show_scores();
  105.     /* If there is no position, then it is already end of game */
  106.     return position;
  107. }
  108.  
  109.